package com.joven.core.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.joven.core.mapper.UserMapper;
import com.joven.core.model.User;
import com.joven.core.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * @author joven_wong
 * 2021/5/26 14:53
 *
 */
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    //spring framerwork 3.0升级到5.0   不再推荐使用字段输入
    //使用setter方式  或者 构造函数方式  注入
//    @Autowired
//    private UserMapper userMapper;

//    @Autowired
//    public void setUserMapper(UserMapper userMapper){
//        this.userMapper = userMapper;
//    }

    private final UserMapper userMapper;

    /**
     * 将方法运行结果进行缓存
     * value：指定缓存组件的名字
     * key：缓存的key。可以使用SpEl表达式
     * condition：缓存条件。（为true时缓存），使用EL表达式
     * unless：否定缓存。（为true时不缓存）unless在方法执行之后判断，所以unless可以用结果作为判断条件。
     */
    @Cacheable(value = "joven", key = "'users'")
    @Override
    public List<User> findAllUser() {
        return userMapper.selectList(null);
    }

    @Cacheable(value = "joven", key = "#id")
    @Override
    public String getUsernameById(Long id) {
        return Optional.ofNullable(userMapper.selectById(id)).get().getName();
    }

    //修改了数据库的数据，同时更新缓存。先调用目标方法，然后缓存方法结果
    //只能是result.id
    @CachePut(value = "joven",key="#result.id")
    @Override
    public User updateUser(User userInfo) {
        userMapper.update(userInfo, null);
        return userInfo;
    }

    //删除数据之后，清除缓存
    @CacheEvict(value = "joven", key = "#id")
    @Override
    public int deleteUser(Long id) {
        return userMapper.deleteById(id);
    }

    public int saveOne(User userInfo){
        return userMapper.insert(userInfo);
    }

}
